/**
 * @description 实现异步请求封装
 */
import { LOGIN_API, PHONE_CODE_URL, SHOW_LIST_URL } from '@/config/urls.conf'
import store from '@/store'
import router from '@/router'
import axios from 'axios'
import { LOGIN_FLAG } from '@/config/common.conf'
import { deCodeApi, enCodeApi } from '@/utils'

// 实现通用配置
const Axios = axios.create({
    baseURL: '/huaxing',
    timeout: 5000
})

// 实现了请求拦截--请求前和请求后
// 定义不需要登录的请求
const noLoginUrls = [
    LOGIN_API
]

Axios.interceptors.request.use(function(config) {
    // 判断是否这个请求需要进行拦截，为什么要拦截？
    // 因为有些请求需要token数据，也就是这个请求在请求之前用户一定是登陆过
    if (noLoginUrls.includes(config.url)) {
        return config
    }

    // 先获取token，然后加上token数据
    let token = store.getters['common/token']
    if (!token) {
        // 用户没有token数据，那么这个请求就不能发起，所以这里直接返回错误信息
        return Promise.reject({code: 8080, message: '用户登录的token数据不存在或则已失效'})
    }

    // 在请求头上带上token数据
    config.headers['X-Token'] = token
    return config
})

// 实现token续期
Axios.interceptors.response.use(response => {
    if (response.data.code === 400 && response.data.message === "token票据已过期，请重新登录") {
        router.push('/login')
    } else {
        // 续期token时间 -- 一定是非不要token请求发送结果
        if (!noLoginUrls.includes(response.config.url)) {
            let cache = sessionStorage.getItem(LOGIN_FLAG)
            try {
                cache = deCodeApi(cache).split('----')
                sessionStorage.setItem(LOGIN_FLAG, enCodeApi(cache[0] + '----' + Date.now()))
            } catch {

            }
        }
    }
    return response
})

/**
 * 为了支持async + await 写法，还有就是减少代码量
 * @param {{url: String, method: 'GET' | 'POST' | 'DELETE' | 'PUT', data?: any, params?: any}} req 请求对象
 */
function ajax(req) {
    return new Promise(resolve => {
        Axios.request({
            url: req.url,
            method: req.method || 'GET',
            data: req.data || {},
            params: req.params || {}
        }).then(({data}) => {
            resolve(data)
        }).catch(e => {
            resolve(e)
        })
    })
}

export default ajax